﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Principal;
using WaterRegimenMonitor.Web.DataModel;

namespace WaterRegimenMonitor.Web.Domain
{
    /// <summary>
    /// 认证主体。
    /// </summary>
    public class UserPrincipal : GenericPrincipal
    {
        #region ---Constructor

        /// <summary>
        /// 初始化类型<see cref="UserPrincipal"/>的新实例。
        /// </summary>
        /// <param name="identity">用户标识。</param>
        /// <param name="roles">用户角色列表。</param>
        public UserPrincipal(IIdentity identity, string[] roles)
            : base(identity, roles)
        {
            this.m_UserID = Guid.Parse(this.Identity.Name);
        }

        /// <summary>
        /// 判断当前用户是否隶属于特定的角色。
        /// </summary>
        /// <param name="role">角色名称。</param>
        /// <returns>
        /// 如果当前用户隶属于特定的角色，则返回<c>true</c>，否则返回<c>false</c>。
        /// </returns>
        public override bool IsInRole(string role)
        {
            return null != RoleList.FirstOrDefault(item => string.Compare(item.RoleName, role, StringComparison.InvariantCultureIgnoreCase) == 0);
        }

        #endregion

        #region ---Property

        /// <summary>
        /// 获得用户编号。
        /// </summary>
        /// <value>
        /// 用于编号。
        /// </value>
        public Guid UserID
        {
            get
            {
                return m_UserID;
            }
        }

        /// <summary>
        /// 获得当前用户所属角色。
        /// </summary>
        /// <value>
        /// 当前用户所属角色。
        /// </value>
        public List<Role> RoleList
        {
            get
            {
                //判断角色列表是否已经初始化
                if (m_RoleList == null)
                {
                    this.m_RoleList = RoleHelper.GetRoleListByUser(User);
                }

                //返回角色列表
                return m_RoleList;
            }
        }


        /// <summary>
        /// 获得当前用户所属角色编号列表。
        /// </summary>
        /// <value>
        /// 当前用户所属角色编号列表。
        /// </value>
        public List<Guid> RoleIDList
        {
            get
            {
                //判断列表是否创建
                if (m_RoleIDList == null)
                {
                    this.m_RoleIDList = RoleList.Select(item => item.RoleID).ToList();
                }

                //返回列表
                return m_RoleIDList;
            }
        }

        /// <summary>
        /// 获得当前登录用户信息。
        /// </summary>
        /// <value>
        /// 当前登录用户信息。
        /// </value>
        public User User
        {
            get
            {
                //判断用户信息是否读取
                if (m_User == null)
                {
                    this.m_User = UserHelper.GetUserByID(m_UserID);
                }

                //返回用户信息
                return m_User;
            }
        }

        /// <summary>
        /// 获得当前用户授权菜单列表。
        /// </summary>
        /// <value>
        /// 当前用户授权菜单列表。
        /// </value>
        public List<MenuInfo> MenuList
        {
            get
            {
                //判断菜单列表是否已经初始化
                if (m_MenuList == null)
                {
                    this.m_MenuList = MenuHelper.GetMenuListByRole(this.RoleList);
                }

                //返回菜单列表
                return m_MenuList;
            }
        }

        #endregion

        #region ---Field

        /// <summary>
        /// 用户编号。
        /// </summary>
        private Guid m_UserID;

        /// <summary>
        /// 当前用户所属角色。
        /// </summary>
        private List<Role> m_RoleList;

        /// <summary>
        /// 当前用户所属角色编号。
        /// </summary>
        private List<Guid> m_RoleIDList;

        /// <summary>
        /// 当前用户。
        /// </summary>
        private User m_User;

        /// <summary>
        /// 菜单列表。
        /// </summary>
        private List<MenuInfo> m_MenuList;

        #endregion
    }
}
